#include "daemon_runner.h"

static int is_running = 1;

static SubProcess_t *sub_processes[SUB_PROCESS_COUNT];
static char *params[] = {"app", "ota"}; // 所有子进程程序的参数

// 信号处理函数 守护进程被kill
void signal_handler(int sig)
{
    is_running = 0;
}

int daemon_runner_run(void)
{
    // 将当前进程变成守护进程
    // 参数 1 : 0 指定当前程序的工作目录不再是所在的目录，而是根目录，防止不能卸载当前程序的情况
    // 参数 2 : 1 不关闭标准输入输出流 0 ：关闭
    daemon(0, 1);

    // 关闭标准输入重定向到 dev/null >> 不能再接收标准输入
    // 关闭标准输出/标准错误输出重定向到 日志文件
    close(STDERR_FILENO);                      // 2
    close(STDOUT_FILENO);                      // 1
    close(STDIN_FILENO);                       // 0
    open("/dev/null", O_RDWR);                 // 0
    open(O_CREAT | O_WRONLY | O_APPEND, 0644); // 1
    open(O_CREAT | O_WRONLY | O_APPEND, 0644); // 2

    // 注册进程结束的信号监听，用于在守护进程结束前，关闭被守护的子进程
    signal(SIGTERM, signal_handler);

    // 初始化要启动的所有子进程信息
    for (int i = 0; i < SUB_PROCESS_COUNT; i++)
    {
        sub_processes[i] = deamon_sub_process_init(params[i]);
    }
    // 循环启动子进程
    while (is_running)
    {
        for (int i = 0; i < SUB_PROCESS_COUNT; i++)
        {
            deamon_sub_process_checkStart(sub_processes[i]);
        }
        sleep(2);
    }
    // 关闭所有子进程
    for (int i = 0; i < SUB_PROCESS_COUNT; i++)
    {
        deamon_sub_process_close(sub_processes[i]);
    }
}
